<?php

class Map
{
    private array $entries;

    public function __construct()
    {
        $this->entries = array();
    }

    /**
     * 设置map的实体
     * @param array $entries map的实体
     * @return void
     */
    public function setEntries(array $entries){
        $this->entries = $entries;
    }

    /**
     * 获取map的大小
     * @return int 返回map的大小
     */
    public function size():int
    {
        return count($this->entries);
    }

    /**
     * 判断map是否为空
     * @return bool 返回map是否为空
     */
    public function isEmpty():bool
    {
        return empty($this->entries);
    }

    /**
     * 判断map是否包含指定的键
     * @param string $key 指定的键
     * @return bool
     */
    public function containsKey(string $key) :bool
    {
        return array_key_exists($key, $this->entries);
    }

    /**
     * 判断map是否包含指定的值
     * @param $value mixed
     * @return bool
     */
    public function containsValue($value):bool
    {
        return in_array($value, $this->entries);
    }

    /**
     * 获取指定键的值
     * @param string $key 指定的键
     * @return mixed|null
     */
    public function get(string $key)
    {
        return $this->entries[$key] ?? null;
    }

    /**
     * 设置指定键的值
     * @param string $key
     * @param mixed $value
     * @return void
     */
    public function put(string $key, $value)
    {
        $this->entries[$key] = $value;
    }

    /**
     * 移除指定键的值
     * @param string $key  键
     * @return bool
     */
    public function remove(string $key):bool
    {
        if (isset($this->entries[$key])) {
            unset($this->entries[$key]);
            return true;
        }
        return false;
    }

    public function clear()
    {
        $this->entries = array();
    }

    /**
     * 获取map的键集合
     * @return string[] 返回map的键集合
     */
    public function keySet():array
    {
        return array_keys($this->entries);
    }

    /**
     * 获取map的值集合
     * @return array 返回map的值集合
     */
    public function values():array
    {
        return array_values($this->entries);
    }

    /**
     *  替换指定键的值
     * @param string $oldKey 原来的键
     * @param string $newKey 新的键
     * @return bool
     */
    public function replaceKey(string $oldKey,string $newKey):bool
    {
        if ($this->containsKey($oldKey) && !$this->containsKey($newKey)) {
            $value = $this->get($oldKey);

            // 移除原来的键值对，不改变顺序
            unset($this->entries[$oldKey]);

            // 添加新的键值对，保持顺序
            $this->entries[$newKey] = $value;

            return true;
        }
        return false;
    }

    /**
     * 替换指定值
     * @return array 返回map的键值对
     */
    public function toArray():array{
        return $this->entries;
    }
}
